# -*- coding: utf-8 -*-

from odoo import models, fields, api
from odoo.exceptions import ValidationError


class UserRole(models.Model):
    """用户角色模型 - 模仿若依角色管理"""
    _name = 'device.user.role'
    _description = '用户角色'
    _order = 'sequence, name'

    name = fields.Char('角色名称', required=True)
    code = fields.Char('角色编码', required=True)
    description = fields.Text('角色描述')
    sequence = fields.Integer('排序', default=10)
    active = fields.Boolean('启用状态', default=True)
    
    # 权限关联
    permission_ids = fields.Many2many(
        'device.permission',
        'device_role_permission_rel',
        'role_id',
        'permission_id',
        string='权限列表'
    )
    
    # 菜单权限
    menu_permission_ids = fields.Many2many(
        'device.menu.permission',
        'device_role_menu_rel',
        'role_id',
        'menu_id',
        string='菜单权限'
    )
    
    # 数据权限范围（参考若依）
    data_scope = fields.Selection([
        ('1', '全部数据权限'),
        ('2', '自定数据权限'),
        ('3', '部门数据权限'),
        ('4', '部门及以下数据权限'),
        ('5', '仅本人数据权限')
    ], string='数据范围', default='1')
    
    # 关联部门（当data_scope为自定数据权限时使用）
    department_ids = fields.Many2many(
        'device.department',
        'device_role_dept_rel',
        'role_id',
        'dept_id',
        string='数据权限部门'
    )
    
    # 创建和修改信息
    create_time = fields.Datetime('创建时间', default=fields.Datetime.now)
    update_time = fields.Datetime('更新时间', default=fields.Datetime.now)
    create_by = fields.Many2one('res.users', '创建者', default=lambda self: self.env.user)
    update_by = fields.Many2one('res.users', '更新者', default=lambda self: self.env.user)
    
    @api.constrains('code')
    def _check_code_unique(self):
        for record in self:
            if self.search_count([('code', '=', record.code), ('id', '!=', record.id)]) > 0:
                raise ValidationError(f'角色编码 {record.code} 已存在，请使用其他编码。')
    
    def write(self, vals):
        vals['update_time'] = fields.Datetime.now()
        vals['update_by'] = self.env.user.id
        return super().write(vals)


class UserRoleAssignment(models.Model):
    """用户角色分配"""
    _name = 'device.user.role.assignment'
    _description = '用户角色分配'
    
    # 支持两种用户类型
    user_id = fields.Many2one('res.users', '系统用户', ondelete='cascade')
    device_user_id = fields.Many2one('device.user', 'Device用户', ondelete='cascade')
    role_id = fields.Many2one('device.user.role', '角色', required=True, ondelete='cascade')
    active = fields.Boolean('启用', default=True)
    assign_time = fields.Datetime('分配时间', default=fields.Datetime.now)
    assign_by = fields.Char('分配者')
    
    _sql_constraints = [
        ('unique_user_role', 'unique(user_id, role_id)', '系统用户角色分配记录不能重复！'),
        ('unique_device_user_role', 'unique(device_user_id, role_id)', 'Device用户角色分配记录不能重复！'),
        ('check_user_type', 'CHECK((user_id IS NOT NULL AND device_user_id IS NULL) OR (user_id IS NULL AND device_user_id IS NOT NULL))', '必须指定且只能指定一种用户类型！')
    ]
